package com.itheima.filter;

import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.MyResponseResult;
import com.itheima.utils.MyJwtUtils;
import com.itheima.utils.MyThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

//@WebFilter(urlPatterns = "/*")
//@Component
public class MyLoginFilter implements Filter {

    //@Autowired
    private MyJwtUtils myJwtUtils;
    //这个方法在每次浏览器请求的时候，都会执行一次
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("浏览器请求了==============================================================================================================================");
        /*
        1.获取用户的请求路径，如果是 去登陆，直接放行
        2.根据请求头 Token 获取令牌
        3.校验令牌是否合法，如果合法则放行
        4.如果不合法，则响应一个错误状态对象
         */
        //获取用户的请求路径
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        String uri = request.getRequestURI();   //获取资源路径 /xxx
//        StringBuffer requestURL = request.getRequestURL();    //获取完整路径，http：//
        if ("/login".equals(uri)){
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
            //走完登录的资源之后，没有必要走下面关于校验令牌的代码了，因此可以使用return提前结束这个过滤器
            return;
        }
        // 2.根据请求头 Token 获取令牌
        String token = request.getHeader("Token");
        //3.校验令牌是否合法，如果合法则放行
        Map<String, Object> map = myJwtUtils.parseJwt(token);
        if (map == null){
            //说明令牌过期或不合法
            //保持前后端请求响应的规范，在这里需要创建一个统一结果对象
            MyResponseResult<Object> result = MyResponseResult.error("NOT_LOGIN");
            //把result响应给前端；（需要把对象转json）由于目前代码还没有执行controller，
            // 因此需要我们自己手动转成json，并手动响应数据
            String jsonString = JSONObject.toJSONString(result);
            HttpServletResponse response =(HttpServletResponse)servletResponse;
            response.getWriter().println(jsonString);
            return;
        }
        //合法的情况 先使用ThreadLocal 本地线程保存一个变量，以便后续使用
        MyThreadLocalUtils.setValue(map);
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
